package com.zeny.express.framework.core.mybatis.dialect;

import java.util.Map;

/**
 * Oracle的方言实现
 * 
 * @author zhuwei
 * @date 2013年8月18日 下午5:01:25
 */
public class OracleDialect implements Dialect {

	/**
	 * 数据库本身是否支持分页
	 * 
	 * @author zhuwei
	 * @date 2013年8月18日 上午8:10:16
	 * @see com.zeny.express.framework.core.mybatis.dialect.Dialect#supportsLimit()
	 */
	@Override
	public boolean supportsLimit() {
		return true;
	}

	/**
	 * 将sql转换为分页SQL
	 * 
	 * @author zhuwei
	 * @date 2013年8月18日 上午8:10:23
	 * @see com.zeny.express.framework.core.mybatis.dialect.Dialect#getLimitString(java.lang.String,
	 *      int, int)
	 */
	@Override
	public String getLimitString(String sql, int offset, int limit,
			Map<String, String> orderMap) {

		StringBuilder sqlPaging = new StringBuilder(sql.length() + 100);
		if (offset > 0) {
			sqlPaging
					.append("SELECT * FROM ( SELECT ROW_.*, ROWNUM ROWNUM_ FROM ( ");
		} else {
			sqlPaging.append("SELECT * FROM ( ");
		}
		
		sqlPaging.append(sql);

		// 排序功能
		if (orderMap != null && orderMap.size() > 0) {
			sqlPaging.append(" ORDER BY ");
			
			for(Map.Entry<String, String> entry : orderMap.entrySet()) {
				sqlPaging.append(entry.getKey()).append(" ").append(entry.getValue()).append(",");
			}
			// ORACLE增加ROWID使其排序稳定
			sqlPaging.append("ROWID");
		}

		if (offset > 0) {
			String endString = offset + "+" + limit;
			sqlPaging.append(") ROW_ ) WHERE ROWNUM_ <= ").append(endString)
					.append("  AND ROWNUM_ > ").append(offset);
		} else {
			sqlPaging.append(") WHERE ROWNUM <= ").append(limit);
		}

		return sqlPaging.toString();
	}

}
